#pragma once

#include "Grid.h"
#include "Observer.h"
#include "Space.h"
#include "BoundedSpace.h"

namespace org
{
	namespace spark
	{
		namespace data
		{

			//using org::spark::core::ExecutionMode;
			using org::spark::core::Observer;
			using org::spark::space::BoundedSpace;
			//using org::spark::space::BoundedSpace3d;
			using org::spark::space::Space;

			/// <summary>
			/// Creates instances of Grid and derived class
			/// based on the current execution mode
			/// @author Monad
			/// 
			/// </summary>
			class GridFactory
			{
				/// <summary>
				/// Creates a 2d-grid of the specific size in the default space </summary>
				/// <param name="xSize"> </param>
				/// <param name="ySize">
				/// @return </param>
			public:
				static Grid *createGrid(int xSize, int ySize);


				/// <summary>
				/// Creates a 3d-grid of the specific size in the default space </summary>
				/// <param name="xSize"> </param>
				/// <param name="ySize"> </param>
				/// <param name="zSize">
				/// @return </param>
				//static Grid3d *createGrid(int xSize, int ySize, int zSize);


				/// <summary>
				/// Creates a 2d-grid of the specific size in the default space </summary>
				/// <param name="xSize"> </param>
				/// <param name="ySize">
				/// @return </param>
				static Grid *createGrid(Space *space, int xSize, int ySize);


				/// <summary>
				/// Creates a 3d-grid of the specific size in the default space </summary>
				/// <param name="xSize"> </param>
				/// <param name="ySize"> </param>
				/// <param name="zSize">
				/// @return </param>
				//static Grid3d *createGrid(Space *space, int xSize, int ySize, int zSize);
			};

		}
	}
}
